package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	// context
	// parent := context.Background()
	// c1 := context.WithValue(parent, "k1", "v1")
	// c2 := context.WithValue(parent, "k2", "v2")
	// c3 := context.WithValue(c1, "k3", "v3")
	// c4 := context.WithValue(c3, "k4", "v4")
	// names := []string{"k1", "k2", "k3", "k4"}
	// for _, name := range names {
	// 	fmt.Println(name, c1.Value(name), c2.Value(name), c3.Value(name), c4.Value(name))
	// }

	// cancelCtx
	// parent := context.Background()
	// ctx, cancelFunc := context.WithCancel(parent) // ctx具有 cancel 能力的
	// defer cancelFunc()
	// if xxxx {
	// 	cancelFunc()
	// 	ctx.Err()
	// }

	// timerCtx
	parent := context.Background()
	ctx, cancel := context.WithTimeout(parent, 10*time.Second)
	defer cancel()
	go func(c context.Context) {
		tick := time.NewTicker(time.Second)
		for {
			select {
			case <-tick.C: // 工作通道，有数据我们就做事情
				fmt.Println("每一秒做一次工作内容")
			case <-c.Done():
				fmt.Println("收到了父协程中 ctx 的结束信号，我子协程退出")
				return // 当前协程结束了
			}
		}
	}(ctx)
	fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~")
	// <-ctx.Done()
	select {
	case <-ctx.Done():
		time.Sleep(2 * time.Second)
		fmt.Println("主协程即将结束了")
	}
	fmt.Println("--------------------------")
}
